package operation;

import Beans.Student;
import User.User;
import Utils.SQLSentencePoll;
import dao.DataOperation;

import java.util.ArrayList;
import java.util.List;

/**
 * 修改指定学生信息的功能对象
 * -- 先根据id显示当前账户信息，然后进行修改。
 */
public class ModifyPersonalInfo implements IOperation{
    @Override
    public boolean operate(User user) {
        System.out.println("修改个人信息");
        subModify(user.getAccountId(),user);
        return true;
    }

    /**
     * 修改账户信息
     * @param accountId 账户id
     */
    public void subModify(String accountId,User user){
        //先显示当前信息
        Student student = DataOperation.queryOne(Student.class, SQLSentencePoll.SpecifiedAccountInfoDisplay, accountId);
        System.out.println("+------- 当前账户信息 -------+");
        assert student != null;
        System.out.println("学号：" + student.getId());
        System.out.println("密码：" + student.getPassword());
        System.out.println("姓名：" + student.getName());
        System.out.println("年龄：" + student.getAge());
        System.out.println("性别：" + student.getGender());
        System.out.println("+--------------------------+");

        System.out.println("账户信息变更");
        List<String> accountInfoList = new AppendStudentInfo().inputStudentInfo(student); //录入新的信息放入list中
        if(accountInfoList != null) { //信息录入完毕

            //accountInfoList.add(accountId); //添加当前账户id
            //这里会报 UnsupportedOperationException , 为什么？

            //解答：
            //因为inputStudentInfo方法的返回是Arrays.asList()的返回，在Arrays类里面封装了自己的ArrayList，继承自AbstractList,
            //它并没有实现add方法，试图调用add方法实际上调用的是AbstractList的add方法，而它的实现是直接抛UnsupportedOperationException.

            //解决办法：构造真正的arrayList对象再调用add方法
            ArrayList<String> newList = new ArrayList<>(accountInfoList);
            newList.add(accountId); //添加要修改的筛选条件，当前账户id

            String newId = accountInfoList.get(0); //要变更为的新id
            String curId = student.getId();//当前账户id
            if(!curId.equals(newId)){ //试图修改当前账户id
                //前先检查新id在学生账户表中是否已经存在
                Student isAnotherStudent = DataOperation.queryOne(Student.class, SQLSentencePoll.SpecifiedAccount_Check,
                        newId);
                if(isAnotherStudent != null){ //已经存在，无法更改
                    System.out.println("输入的变更id已存在，无法更改！");
                    return;
                }
            }
            //执行修改sql
            boolean isUpdate = DataOperation.update(SQLSentencePoll.SpecifiedAccountInfoUpdate, newList.toArray());
            if(isUpdate){
                //同步更新当前角色对象的id属性
                user.setAccountId(accountInfoList.get(0));
                System.out.println("账户信息已变更。");
            }else{
                System.out.println("变更失败！");
            }
        }
    }

}
